]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
extensionSystem: Check metadata types
authorFlorian Müllner <fmuellner@gnome.org>
Wed, 20 Apr 2022 17:29:19 +0000 (19:29 +0200)
committerMarge Bot <marge-bot@gnome.org>
Thu, 21 Apr 2022 08:16:30 +0000 (08:16 +0000)
We currently check that an extension provides required metadata
properties, but then assume that all properties have the expected
type.

It turns out that this is putting too much trust in extensions,
so add an appropriate check.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5347

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2272>

js/ui/extensionSystem.js

index 41a03fdf3a9456f94420e9d6dea2e8cc6d6fb884..fbfd6c4b0569838cd956e1bb72d65a5d06c8ad2c 100644 (file)
@@ -310,11 +310,29 @@ var ExtensionManager = class {
             throw new Error(`Failed to parse metadata.json: ${e}`);
         }
 
-        let requiredProperties = ['uuid', 'name', 'description', 'shell-version'];
+        const requiredProperties = [{
+            prop: 'uuid',
+            typeName: 'string',
+        }, {
+            prop: 'name',
+            typeName: 'string',
+        }, {
+            prop: 'description',
+            typeName: 'string',
+        }, {
+            prop: 'shell-version',
+            typeName: 'string array',
+            typeCheck: v => Array.isArray(v) && v.length > 0 && v.every(e => typeof e === 'string'),
+        }];
         for (let i = 0; i < requiredProperties.length; i++) {
-            let prop = requiredProperties[i];
+            const {
+                prop, typeName, typeCheck = v => typeof v === typeName,
+            } = requiredProperties[i];
+
             if (!meta[prop])
                 throw new Error(`missing "${prop}" property in metadata.json`);
+            if (!typeCheck(meta[prop]))
+                throw new Error(`property "${prop}" is not of type ${typeName}`);
         }
 
         if (uuid != meta.uuid)